/**
 * 设置和偏好端到端测试
 * 测试游戏设置、音频控制和数据持久化
 */
describe('设置和偏好测试', () => {
  beforeEach(() => {
    cy.visit('/')
  })

  describe('设置面板测试', () => {
    beforeEach(() => {
      // 打开设置面板
      cy.get('[data-cy="settings-btn"]').click()
    })

    it('应该显示设置面板', () => {
      // 验证设置面板显示
      cy.get('[data-cy="settings-panel"]').should('be.visible')
      cy.get('[data-cy="settings-title"]').should('contain', '游戏设置')
      
      // 验证设置选项
      cy.get('[data-cy="audio-settings"]').should('be.visible')
      cy.get('[data-cy="control-settings"]').should('be.visible')
      cy.get('[data-cy="display-settings"]').should('be.visible')
    })

    it('应该能够调整音频设置', () => {
      // 测试主音量控制
      cy.get('[data-cy="master-volume"]').should('be.visible')
      cy.get('[data-cy="master-volume"]').invoke('val', 50).trigger('input')
      
      // 验证音量变化
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.masterVolume).to.equal(0.5)
      })
      
      // 测试音效开关
      cy.get('[data-cy="sound-effects-toggle"]').click()
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.soundEnabled).to.be.false
      })
      
      // 测试背景音乐开关
      cy.get('[data-cy="background-music-toggle"]').click()
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.musicEnabled).to.be.false
      })
    })

    it('应该能够调整控制设置', () => {
      // 测试控制方案选择
      cy.get('[data-cy="control-scheme"]').select('touch')
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.controlScheme).to.equal('touch')
      })
      
      // 测试控制灵敏度
      cy.get('[data-cy="control-sensitivity"]').invoke('val', 75).trigger('input')
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.controlSensitivity).to.equal(0.75)
      })
    })

    it('应该能够调整显示设置', () => {
      // 测试画质设置
      cy.get('[data-cy="graphics-quality"]').select('high')
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.graphicsQuality).to.equal('high')
      })
      
      // 测试粒子效果开关
      cy.get('[data-cy="particle-effects-toggle"]').click()
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.particleEffects).to.be.false
      })
      
      // 测试屏幕震动开关
      cy.get('[data-cy="screen-shake-toggle"]').click()
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.screenShake).to.be.false
      })
    })

    it('应该能够重置设置', () => {
      // 修改一些设置
      cy.get('[data-cy="master-volume"]').invoke('val', 25).trigger('input')
      cy.get('[data-cy="sound-effects-toggle"]').click()
      
      // 重置设置
      cy.get('[data-cy="reset-settings-btn"]').click()
      cy.get('[data-cy="confirm-reset-btn"]').click()
      
      // 验证设置已重置
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.masterVolume).to.equal(1.0)
        expect(store.settings.soundEnabled).to.be.true
      })
    })

    it('应该保存设置更改', () => {
      // 修改设置
      cy.get('[data-cy="master-volume"]').invoke('val', 60).trigger('input')
      cy.get('[data-cy="sound-effects-toggle"]').click()
      
      // 关闭设置面板
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 重新打开设置面板
      cy.get('[data-cy="settings-btn"]').click()
      
      // 验证设置已保存
      cy.get('[data-cy="master-volume"]').should('have.value', '60')
      cy.get('[data-cy="sound-effects-toggle"]').should('not.be.checked')
    })
  })

  describe('数据持久化测试', () => {
    it('应该保存游戏进度', () => {
      // 开始游戏并获得一些分数
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 模拟游戏进行
      cy.gameAction('jump')
      cy.wait(1000)
      cy.gameAction('slide')
      cy.wait(1000)
      
      // 获取当前分数
      cy.get('[data-cy="score-display"]').invoke('text').then((score) => {
        const currentScore = parseInt(score)
        
        // 刷新页面
        cy.reload()
        
        // 验证最高分数被保存
        cy.get('[data-cy="high-score"]').should('contain', currentScore.toString())
      })
    })

    it('应该保存解锁的角色', () => {
      // 模拟解锁新角色的条件
      cy.window().then((win) => {
        win.localStorage.setItem('unlockedCharacters', JSON.stringify(['default', 'speedster']))
      })
      
      // 刷新页面
      cy.reload()
      
      // 进入角色选择
      cy.get('[data-cy="start-game-btn"]').click()
      
      // 验证角色已解锁
      cy.get('[data-cy="character-speedster"]').should('not.have.class', 'locked')
    })

    it('应该保存成就进度', () => {
      // 模拟获得成就
      cy.window().then((win) => {
        const achievements = [
          { id: 'first-jump', unlocked: true, unlockedAt: Date.now() },
          { id: 'score-100', unlocked: true, unlockedAt: Date.now() }
        ]
        win.localStorage.setItem('achievements', JSON.stringify(achievements))
      })
      
      // 刷新页面
      cy.reload()
      
      // 打开成就面板
      cy.get('[data-cy="achievements-btn"]').click()
      
      // 验证成就已保存
      cy.get('[data-cy="achievement-first-jump"]').should('have.class', 'unlocked')
      cy.get('[data-cy="achievement-score-100"]').should('have.class', 'unlocked')
    })

    it('应该处理存储配额超限', () => {
      // 模拟存储空间不足
      cy.window().then((win) => {
        const originalSetItem = win.localStorage.setItem
        win.localStorage.setItem = () => {
          throw new Error('QuotaExceededError')
        }
        
        // 尝试保存数据
        cy.startNewGame()
        cy.selectCharacter('default')
        
        // 验证错误处理
        cy.get('[data-cy="storage-warning"]').should('be.visible')
        
        // 恢复原始方法
        win.localStorage.setItem = originalSetItem
      })
    })
  })

  describe('用户偏好测试', () => {
    it('应该记住用户的控制偏好', () => {
      // 设置触摸控制
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="control-scheme"]').select('touch')
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 验证触摸控制界面显示
      cy.get('[data-cy="touch-controls"]').should('be.visible')
    })

    it('应该记住音频偏好', () => {
      // 关闭音效
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="sound-effects-toggle"]').click()
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 开始游戏
      cy.startNewGame()
      cy.selectCharacter('default')
      
      // 执行动作（应该没有音效）
      cy.gameAction('jump')
      
      // 验证音效被禁用
      cy.window().its('gameStore').then((store) => {
        expect(store.settings.soundEnabled).to.be.false
      })
    })

    it('应该适应不同的屏幕尺寸', () => {
      // 测试桌面尺寸
      cy.viewport(1920, 1080)
      cy.get('[data-cy="game-container"]').should('have.class', 'desktop-layout')
      
      // 测试平板尺寸
      cy.viewport('ipad-2')
      cy.get('[data-cy="game-container"]').should('have.class', 'tablet-layout')
      
      // 测试手机尺寸
      cy.viewport('iphone-x')
      cy.get('[data-cy="game-container"]').should('have.class', 'mobile-layout')
      cy.get('[data-cy="touch-controls"]').should('be.visible')
    })
  })

  describe('可访问性测试', () => {
    it('应该支持高对比度模式', () => {
      // 启用高对比度
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="high-contrast-toggle"]').click()
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 验证高对比度样式
      cy.get('body').should('have.class', 'high-contrast')
    })

    it('应该支持减少动画', () => {
      // 启用减少动画
      cy.get('[data-cy="settings-btn"]').click()
      cy.get('[data-cy="reduce-motion-toggle"]').click()
      cy.get('[data-cy="close-settings-btn"]').click()
      
      // 验证动画被减少
      cy.get('body').should('have.class', 'reduce-motion')
    })

    it('应该有适当的ARIA标签', () => {
      cy.get('[data-cy="settings-btn"]').click()
      
      // 验证ARIA标签
      cy.get('[data-cy="master-volume"]').should('have.attr', 'aria-label')
      cy.get('[data-cy="sound-effects-toggle"]').should('have.attr', 'aria-describedby')
      cy.get('[data-cy="settings-panel"]').should('have.attr', 'role', 'dialog')
    })
  })
})